/**
 * AES 加密工具类
 * 用于小程序中的数据加密，与后端保持一致
 * 
 * 加密规格：
 * - 算法: AES-256-CBC
 * - 密钥: qwertyuiop1234567654zaqwsxcderfv (32字节)
 * - IV: 随机生成16字节
 * - 填充: PKCS7
 * - 编码: Base64
 */

const CryptoJS = require('../crypto-full.js');

// AES 密钥（32字节，与服务器保持一致）
const AES_KEY = 'qwertyuiop1234567654zaqwsxcderfv';

/**
 * 生成随机16字节的 IV
 * 微信小程序环境下使用 Math.random() 手动生成
 */
function generateIV() {
  try {
    // 尝试使用 CryptoJS 的随机方法（在某些环境下可能失败）
    return CryptoJS.lib.WordArray.random(16);
  } catch (e) {
    // 如果失败，使用 Math.random() 手动生成
    console.log('⚠️ CryptoJS.random 失败，使用 Math.random 生成 IV');
    const words = [];
    for (let i = 0; i < 4; i++) {
      // 生成32位随机数（一个 word）
      words.push((Math.random() * 0x100000000) | 0);
    }
    return CryptoJS.lib.WordArray.create(words, 16);
  }
}

/**
 * 生成验证码（6位数字）
 * 支持特定手机号固定验证码（测试用）
 */
function generateVerificationCode(phone) {
  // 测试手机号使用固定验证码
  const testPhones = {
    '18366542015': '123456',
    '19999999999': '888888',
    '13800138000': '666666'
  };

  if (testPhones[phone]) {
    console.log(`🔐 使用测试手机号 ${phone} 的固定验证码: ${testPhones[phone]}`);
    return testPhones[phone];
  }

  // 生成随机6位数字验证码
  const code = Math.floor(100000 + Math.random() * 900000).toString();
  console.log(`🔐 生成随机验证码: ${code}`);
  return code;
}

/**
 * AES 加密
 * @param {Object} data - 要加密的数据对象
 * @returns {string} Base64编码的加密数据
 */
function aesEncrypt(data) {
  try {
    console.log('🔐 开始 AES 加密');
    console.log('📝 原始数据:', data);

    // 添加时间戳（如果没有的话）
    // ⚠️ 注意：timestamp 必须是数字类型，不能是字符串！
    if (!data.timestamp) {
      data.timestamp = Math.floor(Date.now() / 1000);
    }

    // 转换为 JSON 字符串
    const jsonStr = JSON.stringify(data);
    console.log('📊 JSON字符串:', jsonStr);

    // 生成随机 IV
    const iv = generateIV();
    console.log('🔑 生成的IV:', iv.toString());

    // 转换密钥和数据
    const key = CryptoJS.enc.Utf8.parse(AES_KEY);
    const plainText = CryptoJS.enc.Utf8.parse(jsonStr);

    // 执行加密
    const encrypted = CryptoJS.AES.encrypt(plainText, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    });

    // ⚠️ 关键修复：将 IV 字节和密文字节拼接后，再整体 Base64 编码
    // 参考 playtrue3 项目的正确实现
    const ivWords = iv.words;
    const cipherWords = encrypted.ciphertext.words;
    
    // 合并 IV 和密文的 WordArray
    const combinedWords = ivWords.concat(cipherWords);
    const combinedWordArray = CryptoJS.lib.WordArray.create(combinedWords, iv.sigBytes + encrypted.ciphertext.sigBytes);
    
    // 对整体进行 Base64 编码
    const result = combinedWordArray.toString(CryptoJS.enc.Base64);

    console.log('✅ 加密成功');
    console.log('📏 IV 字节数:', iv.sigBytes);
    console.log('📏 密文字节数:', encrypted.ciphertext.sigBytes);
    console.log('📏 总字节数:', iv.sigBytes + encrypted.ciphertext.sigBytes);
    console.log('🔒 Base64 结果长度:', result.length);
    console.log('🔒 Base64 结果前50字符:', result.substring(0, 50));

    return result;
  } catch (error) {
    console.error('💥 AES 加密失败:', error);
    throw error;
  }
}

/**
 * 创建加密载荷
 * @param {Object} data - 要加密的数据
 * @returns {Object} 包含 encrypted_data 的对象
 */
function createEncryptedPayload(data) {
  const encryptedData = aesEncrypt(data);
  return {
    encrypted_data: encryptedData
  };
}

/**
 * AES 解密（用于调试）
 * @param {string} encryptedData - Base64编码的加密数据
 * @returns {Object} 解密后的数据对象
 */
function aesDecrypt(encryptedData) {
  try {
    console.log('🔓 开始 AES 解密');

    // Base64 解码整体数据
    const combinedBytes = CryptoJS.enc.Base64.parse(encryptedData);
    
    // 提取 IV（前16字节）
    const ivWords = [];
    for (let i = 0; i < 4; i++) {
      ivWords.push(combinedBytes.words[i]);
    }
    const iv = CryptoJS.lib.WordArray.create(ivWords, 16);
    
    // 提取密文（16字节之后）
    const cipherWords = combinedBytes.words.slice(4);
    const ciphertext = CryptoJS.lib.WordArray.create(cipherWords, combinedBytes.sigBytes - 16);
    
    console.log('🔑 IV 字节数:', iv.sigBytes);
    console.log('📦 密文字节数:', ciphertext.sigBytes);

    // 转换密钥
    const key = CryptoJS.enc.Utf8.parse(AES_KEY);

    // 创建密文对象
    const cipherParams = CryptoJS.lib.CipherParams.create({
      ciphertext: ciphertext
    });

    // 执行解密
    const decrypted = CryptoJS.AES.decrypt(cipherParams, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    });

    // 转换为 UTF-8 字符串
    const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8);
    console.log('✅ 解密成功:', decryptedStr);

    // 解析 JSON
    return JSON.parse(decryptedStr);
  } catch (error) {
    console.error('💥 AES 解密失败:', error);
    throw error;
  }
}

module.exports = {
  generateVerificationCode,
  aesEncrypt,
  aesDecrypt,
  createEncryptedPayload  // 🔐 导出加密载荷创建方法（用于微信支付等接口）
};

